// const fs = require('fs')
//第一节课
// console.log("hello world Mrzhang")
// console.log(global)
// console.log(globalThis == global)

//第二节课
// fs.readFile('./in1.txt','utf8', (err, data) => {
//     if (err) 
//         console.log('in1 文件读取失败 '+ err)
//   console.log('in1 文件读取成功 内容为 '+ data.toString())
// })

// fs.writeFile('./out.txt', 'hello world', (err) => {
//     if (err) 
//         console.log('out 文件写入失败 '+ err)
//   console.log('out 文件写入成功')
// })

// fs.readFile('./out.txt','utf8', (err, data) => {
//     if (err) 
//         console.log('out 文件读取失败 '+ err)
//   console.log('out 文件读取成功 内容为 '+ data.toString())
// })

// 练习整理数据 读取003.txt文件 内容为：小张=85，小赵=87，小刘=80 小王=90，小李=88，将内容读取保存到004.txt文件中，并将成绩按降序排序
// 声明空数组和标志位变量（虽然flag在此代码中未被使用）
// let arr = [];
// let flag = true;

// 读取003.txt文件内容
// fs.readFile('./003.txt', 'utf8', (err, data) => {
  // 错误处理：如果读取文件失败，输出错误信息并返回
  // if (err) {
  //   console.log('003 文件读取失败 ' + err);
  //   return;
  // }
  // 输出文件读取成功信息和文件内容
  // console.log('003 文件读取成功 内容为 ' + data.toString());
  // 将文件内容按逗号分割成数组
  // const dataArray = data.split('，'); 
  // 创建存储处理后数据的数组
  // const scoreData = [];
  // 遍历分割后的数组，处理每个数据项
  // dataArray.forEach(item => {
  //   将每项按等号分割，得到姓名和分数
  //   const [name, score] = item.split('=');
  //   确保姓名和分数都存在
  //   if (name && score) {
  //     将处理后的数据以对象形式存入scoreData数组
  //     scoreData.push({
  //       name: name.trim(),   // 去除姓名前后空格
  //       score: parseInt(score.trim())  // 去除分数前后空格并转换为整数
  //     });
  //   }
  // });
//   scoreData.sort((a, b) => a.score - b.score);
//   const sortedContent = scoreData.map(item => `${item.name}=${item.score}`).join('，');
//   fs.writeFile('./004.txt', sortedContent, (err) => {
//     if (err) {
//       console.log('004 文件写入失败 ' + err);
//       return;
//     }
//     console.log('004 文件写入成功，排序后的内容：' + sortedContent);
//   });
// });
// 程序运行流程：
// 1.读取003.txt文件内容
// 2.将文件内容按逗号分割成数组
// 3.将每项按等号在再分割，得到姓名和分数
// 4.将处理后的数据以对象形式存入scoreData数组
// 5.按分数升序排序
// 6.将排序后的数据重新组合成字符串格式
// 7.将排序后的内容写入004.txt文件



//第三节课

// let arr = [];
// let flag = true;

// // 读取003.txt文件内容
// fs.readFile('./003.txt', 'utf8', (err, data) => {
//   if (err) {
//     console.log('003 文件读取失败 ' + err);
//     return;
//   }
//   console.log('003 文件读取成功 内容为 ' + data.t;/oString());
//   const dataArray = data.split('，'); 
//   const scoreData = [];
//   dataArray.forEach(item => {
//     const [name, score] = item.split('=');
//     if (name && score) {
//       scoreData.push({
//         name: name.trim(),
//         score: parseInt(score.trim())  
//       });
//     }
//   });
//   scoreData.sort((a, b) => a.score - b.score);
//   const sortedContent = scoreData.map(item => `${item.name}=${item.score}`).join('，');
//   fs.writeFile('./004.txt', sortedContent, (err) => {
//     if (err) {
//       console.log('004 文件写入失败 ' + err);
//       return;
//     }
//     console.log('004 文件写入成功，排序后的内容：' + sortedContent);
//   });
// });

//第四节课

// const path = require('path')

// const pathStr = path.join('q','/w','..','./d','e')
// console.log(pathStr)

//第五节课
// 1.加载三种模块的方式
// 内置的fs模块
// const fs = require('fs')
// 加载用户自定义模块
// const sum = require('./module_test')
// 第三方模块
// const moment = require('moment')
// 使用require模块加载其他模块时，会执行被加载模块中的所有代码

// 2.node.js中的模块作用域 isolates，即每个模块都运行在单独的isolate中，互不干扰
// 3.node.js中的模块加载机制：
  // 3.2. 缓存机制：node.js中的模块加载机制是先从缓存中查找，如果缓存中没有，则从文件系统中加载。
  // 3.3. 文件系统加载：node.js中的模块加载机制是先从文件系统中加载，如果文件不存在，则报错。

// 4.在模块中 都有一个modulele 对象，该对象中有一个属性exports，该属性是一个对象，该对象中存放模块的导出内容


//第六节课
//模块调用时 module.exports > exports 

//第七节课
// npm 机制
// npm install 命令会自动将依赖包安装到node_modules目录下
// 1.就是第三方模块又叫包 包是集合了多个js文件的集合
// 2.可通过npm install 命令安装
// 3.npm install 命令会自动将依赖包安装到node_modules目录下
// 4.安装包后 在代码中通过require()方法引入
// 包的必要性：
// 1.避免重复开发，避免重复造轮子
// 2.方便管理、更新 
// 3.由于nodejs内置模块仅提供一些底层api 导致开发效率较低 
//   各位程序猿基于内置模块封装一些第三方模块 提供更高级的API

//第八节课
//作业：
// 1.查阅如何解决npm包下载速度慢的问题
//  npm 包下载速度慢是由于默认镜像服务器位于国外，网络连接不稳定导致的。常见解决方法如下：
//  切换镜像源：使用国内镜像
//  使用代理工具：通过 VPN 或代理加速网络连接
//  升级 npm 版本：新版本可能有性能优化 npm install -g npm

// 2.了解npm镜像服务器，学会切换
//  npm 镜像服务器是 npm 仓库的副本，国内镜像能显著提高下载速度。
//  常用国内镜像：
//  淘宝 npm 镜像：https://registry.npm.taobao.org
//  华为云镜像：https://mirrors.huaweicloud.com/repository/npm/
//  腾讯云镜像：https://mirrors.cloud.tencent.com/npm/

//  切换镜像的命令：
//   # 永久设置镜像
//   npm config set registry https://registry.npm.taobao.org
//   # 查看当前镜像设置
//   npm config get registry
//   # 恢复默认官方镜像
//   npm config set registry https://registry.npmjs.org

// 3.了解nrm小工具
// nrm是一个方便管理 npm 镜像源的工具，能快速切换不同镜像。
// 使用方法：
// npm install -g nrm
// # 查看可用镜像列表（带*的是当前使用的镜像）
// nrm ls
// # 切换到指定镜像（如淘宝镜像）
// nrm use taobao
// # 添加自定义镜像
// nrm add 镜像名称 镜像地址
// # 删除镜像
// nrm del 镜像名称
// # 测试各镜像的响应速度
// nrm test
// 优势：1.可以可视化管理多个镜像源
//      2.避免记忆冗长的镜像地址，适合需要频繁切换不同环境的开发场景。

//第九节课
//Express
// Express 是一个基于 Node.js 的 web 应用框架，用于快速创建、部署、托管 web 应用程序。
// Express 框架提供了一系列的 API，用于处理 HTTP 请求和响应，并支持路由、中间件、模板引擎等功能。
// Express 框架的安装：
// npm install express --save
// Express 框架的使用：
// 创建一个 Express 应用程序：
// const express = require('express');
// const app = express();
// 创建一个路由：
// app.get('/', (req, res) => {
//   res.send('Hello World!');
// });
// 启动服务器：
// app.listen(3000, () => {
//   console.log('Server started on port 3000');
// });
// Express 框架的常见用法：
// 1. 路由：Express 框架提供了路由功能，用于处理 HTTP 请求。路由定义了请求的 URL 和处理函数。
// 2. 中间件：Express 框架提供了中间件功能，用于处理 HTTP 请求。中间件可以处理请求、响应、错误等，并返回结果。
// 3. 模板引擎：Express 框架提供了模板引擎功能，用于生成 HTML 页面。模板引擎可以处理数据、布局、样式等，并返回结果。
// 4. 静态文件：Express 框架提供了静态文件功能，用于处理静态文件，如 CSS、JavaScript、图片等。
// 5. 错误处理：Express 框架提供了错误处理功能，用于处理错误。错误处理可以返回错误信息，并返回结果。